//封装user.js，用来管理所有与用户相关的状态

//导入封装好的Token的方法
import { getToken, setToken, removeToken, setTimeStemp } from '@/utils/auth'

//导入登录接口
import { loginApi, getInfoApi } from '@/api/user'

//导入获取员工基本信息接口
import { getEmpoloyeesApi } from '@/api/employees'

//管理状态
const state = {
  //用来存储用户登录之后的Token
  token: getToken(), //如果在浏览器中的cookie保存了Token,直接取出来使用即可
  //初始化用户数据
  userInfo: {}
}

//修改状态（同步操作）
const mutations = {
  //保存Token
  setToken (state, payload) {
    //保存到vuex中
    state.token = payload
    //保存到cookie中
    setToken(payload)
    //保存使用Token的时间戳
    setTimeStemp()
  },
  //清除Token
  removeToken (state, payload) {
    //从vuex中删除
    state.token = null //从cookIe中删除
    removeToken()
  },
  //保存用户数据
  saveUserInfo (state, payload) {
    state.userInfo = payload
  },
  //删除用户数据
  removeUserInfo (state) {
    state.userInfo = {}
  }
}

//修改状态（异步操作）
const actions = {
  //完成登录
  //payload:用户登录的信息
  async login (context, payload) {
    try {
      //(1)调用登录接口
      const res = await loginApi(payload)
      // console.log(res)
      //(2)判断一下是否登录成功
      if (res.message == '登录成功') {
        //(3)保存token状态
        const token = res.data
        context.commit('setToken', token)
      }
    } catch (error) {
      console.log(error.message)
      //把错误信息抛给login/index.vue中的登录方法处
      return Promise.reject(error)
    }
  },
  //发送请求获取用户数据
  async getUserInfo (context) {
    //(1)发送网络请求,此接口只获取到了部分用户信息
    const res = await getInfoApi()
    //  console.log(res);
    //(2)所有需要发送另外一个接口来获取用户的另一部分信息，即用户头像
    const baseRes = await getEmpoloyeesApi(res.data.userId)
    //(3)讲获取的两部分信息合并到一起,重复的信息部分会后面覆盖前面
    const result = { ...res.data, ...baseRes.data }
    // console.log(result);
    context.commit('saveUserInfo', result)
    //此处是伏笔，返回得到的用户信息,暂时用不到
    return result
  },
  //完成登出的操作：需要删除token和用户信息
  logOut (context) {
    //删除token
    context.commit('removeToken')
    //删除用户信息
    context.commit('removeUserInfo')
  }
}

export default {
  namespaced: true, //开启命名空间
  state,
  mutations,
  actions
}
